#ifndef USRAI_H
#define USRAI_H

#include "AI.h"

extern tagGame tagUsrGame;
extern ins UsrIns;
/*##########DO NOT MODIFY THE CODE ABOVE##########*/

#include <set>
#include <unordered_map>

class UsrAI:public AI
{
public:
    UsrAI(){this->id=0;}
    ~UsrAI(){}

private:
    void processData() override;
    tagInfo getInfo(){return tagUsrGame.getInfo();}
    int AddToIns(instruction ins) override
    {
        UsrIns.lock.lock();
        ins.id=UsrIns.g_id;
        UsrIns.g_id++;
        UsrIns.instructions.push(ins);
        UsrIns.lock.unlock();
        return ins.id;
    }
    void clearInsRet() override
    {
        tagUsrGame.clearInsRet();
    }
    /*##########DO NOT MODIFY THE CODE IN THE CLASS##########*/
    bool tryBuildBuilding(int buildingType, int requiredWood, int maxCount, int reqiredBuilding,int is_settler=0);
    //
};

/*##########YOUR CODE BEGINS HERE##########*/

struct Zone {
    int centerX, centerY;
    int radius;
};

struct MyAIState {
    // --- 战略控制 ---
    int stage = 0; // 0:石器, 1:升级中, 2:工具
    bool zones_initialized = false;
    bool wood_upgrade_done = false; // 工具时代伐木科技

    // --- 区域规划 ---
    Zone residentialZone;
    Zone farmZone;
    Zone militaryZone;

    // --- 本地地图缓存 ---
    byte grid[128][128];
    
    // --- 己方陆地标记 ---
    bool ownLand[128][128] = {{false}};
    
    // --- escape历史记录 ---
    map<int, vector<Point>> recent_escape_positions; // 每个单位最近的escape位置
    map<int, int> escape_attempt_counters; // escape尝试计数器
    bool ownLand_initialized = false;

    // --- 单位/建筑的快速查找表 ---
    map<int, tagFarmer> farmers;
    map<int, tagBuilding> buildings;
    map<int, tagResource> resources;

    // --- 单位状态分类列表 ---
    vector<int> idleFarmerSNs;
    vector<int> woodcutterSNs;
    vector<int> stoneMinerSNs;
    vector<int> hunterSNs;
    vector<int> fisherSNs;
    
    // --- 渔船-船坞绑定 ---
    map<int, int> fishing_boat_dock_assignment; // 渔船SN -> 船坞SN 的绑定关系

    // --- 追踪与计数 ---
    std::unordered_map<int, int> pending_buildings; // set -> unordered_map, for counting
    int fishing_boat_count = 0;
    int completed_dock_count = 0;
    
    // --- 战船编队控制 ---
    bool warship_group_launched = false; // (deprecated) 首次舰队标志
    unordered_set<int> launched_warship_SNs; // 已经出发的战船SN集合
    int warship_batch_size = 6; // 每批至少多少艘战船一起出发，可调
    // --- 发现敌方陆地与运输 ---
    bool enemy_land_found = false;   // 是否已发现敌岸
    Point enemy_land_pos = {-1, -1}; // 敌岸坐标（格）
    bool transport_requested = false; // 已向船坞下单运输船
    int  transport_sn = -1;           // 运输船 SN
    bool farmers_loaded = false;      // 已装载农民
    bool transport_dispatched = false; // 运输船已驶向敌岸
    // 运输船靠岸锚定
    Point transport_shore_pos = {-1, -1}; // 选定的固定靠岸点
    bool transport_anchored = false;      // 是否已靠岸锚定
    // 运输船集合陆地格（与靠岸海面格正交相邻的可走陆地）
    Point transport_rally_land = {-1, -1};
    Point prev_transport_shore_pos = {-1, -1};
    // 运输船登陆候选位置与索引（避免重复尝试一个点）
    vector<Point> transport_landing_candidates; // 敌岸“靠海陆地”候选
    int transport_landing_index = 0;
    // 运输船征兵状态
    std::set<int> boarding_farmers;   // 正在上船的农民，防止被重新分配工作
    std::vector<int> transport_squad; // 运输船小队名单（固定4人）
    // 运输阶段动态锚定与引导
    std::unordered_map<int,int> farmer_stuck_frames; // 农民在集合点附近的卡住帧数
    int next_transport_reanchor_frame = 0;           // 下一次允许重新选锚点的帧
    // 已尝试过的登陆点（避免反复在两个点之间来回）
    std::unordered_set<int> tried_landing_hash;      // hash = (x<<8) | y （128x128 网格足够）
    // --- 舰船探索状态 ---
    Point shared_exploration_target = {-1, -1};
    int exploration_phase = 0; // 0: 对角探索, 1: 沿海岸线探索
    Point enemy_coastline_start = {-1, -1}; // 敌方海岸线起点
    int coastline_search_angle = 0; // 简化：用角度代替复杂的索引系统
    // --- 敌岸据点（二阶段通关目标） ---
    bool foothold_active = false;      // 是否已在敌岸建立据点（一次成功登陆后）
    Point foothold_land = {-1, -1};    // 据点陆地坐标（靠海陆地）
    std::unordered_set<int> foothold_farmers; // 驻扎在敌岸的村民SN集合（禁止调度）
    bool fleet_guard_mode = false;     // 舰队守备模式（不再巡逻）
    Point fleet_rally = {-1, -1};      // 舰队驻扎点（靠海海面坐标）
    
    // --- 编队重组状态 ---
    Point regrouping_point = {-1, -1}; // 重组集结点
    bool regrouping_mode = false; // 是否处于重组模式
    // --- 指令跟踪与资源预算 ---
    std::unordered_map<int,int> build_cmd_to_type;
    int reserved_wood = 0;
    // --- 科技管理 ---
    std::unordered_set<int> finished_techs; // 已完成科技 Action 常量集合
    
    // --- 海岸线探索状态（全局共享） ---
    vector<Point> symmetric_targets;        // 对称探索点列表（最多3个）
    int current_target_index = 0;           // 当前探索第几个目标
    int target_stuck_frames = 0;            // 当前目标卡住帧数
    int total_exploration_frames = 0;       // 总探索时间计数
    int last_exploration_reset_frame = 0;   // 上次重置探索的帧数
    // 当前编队共享攻击目标
    int current_fleet_target_sn = -1;
    int fleet_target_last_seen_frame = -1;
    
    // --- 渔船探索状态 ---
    vector<Point> fishing_explore_targets;   // 渔船探索目标点序列（按由近到远）
    int fishing_explore_index = 0;           // 当前发放到第几个目标
    int fishing_targets_last_refresh_frame = 0; // 上次刷新目标列表的帧
};

// 全局的AI状态实例
extern MyAIState g_ai_state;

// 辅助函数声明
void updateGameState(const tagInfo& info, const map<int, tagResource>& resource_map);
void executeStage0_EconomicBoom(AI* ai, const tagInfo& info);
void executeStage1_Upgrading(AI* ai, const tagInfo& info); // New function for upgrading stage
void executeStage2_ToolAgeEconomyAndNavy(AI* ai, const tagInfo& info); // Renamed from executeStage1_NavalControl
void initializeZones(AI* ai, const tagBuilding& town_center);
Point findPlacement(AI* ai, int buildingType, int builder_sn, const tagInfo& info);
Point findPlacementInZone(int sizeX, int sizeY, const Zone& zone, const tagInfo& info);
bool isPlacementLegalandSafe(int x, int y, int sizeX, int sizeY, const tagInfo& info);
void getBuildingSize(int buildingType, int& sizeX, int& sizeY);
Point getSpiralPoint(int center_x, int center_y, int index, int radius);
void assignFarmersToUnfinishedBuildings(AI* ai, const tagInfo& info, vector<int>& available_idle_farmers);
vector<Point> generateCoastlineExplorationPath(Point start_land, const tagInfo& info);
const tagBuilding* getTownCenter(const tagInfo& info);
int findNearestResource(const Point& pos, int resource_type, const tagInfo& info);
bool is_valid_dock_location(int x, int y, const tagInfo& info);
Point findDockPlacement(AI* ai, const tagInfo& info);
Point findCoastalStockPlacement(AI* ai, const tagInfo& info);
bool building_type_exists(int buildingType);
Point findPlacementAroundPoint(int sizeX, int sizeY, Point center, int maxRadius, const tagInfo& info);
  // 寻找靠海陆地（四邻含海洋），可用于运输船下船
  Point findCoastalLandNear(Point center, const tagInfo& info, bool prefer_enemy_land);
  // 渔船探索：从我方市镇中心/船坞附近出发，生成由近到远的一串安全海域目标
  Point findNextFishingExploreTarget(const tagInfo& info);
  Point generateEmergencyTarget(const tagArmy &ship, const tagInfo &info);
/*##########YOUR CODE ENDS HERE##########*/

#endif // USRAI_H
